﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics.CodeAnalysis;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using LM.InterfacesFabricas.DTOs;
using LM.InterfacesFabricas.Fabricas;
using LM.InterfacesFabricas.Interfaces.Servicos;

namespace LM.Tela.Desktop.Formularios
{
    public partial class frmCadastroDeCliente : Form
    {
        private IList<DtoTelefone> ListTelefone { get; set; }
        private IList<DtoEndereco> ListEndereco { get; set; }
        private IList<DtoDependente> ListDependente { get; set; }

        public frmCadastroDeCliente()
        {
            InitializeComponent();
            ListTelefone = new List<DtoTelefone>();
            ListEndereco = new List<DtoEndereco>();
            ListDependente = new List<DtoDependente>();
        }

        #region Form Actions

        private void btnAddTelefone_Click( object sender, EventArgs e )
        {
            if ( String.IsNullOrWhiteSpace( txtNome.Text ) )
            {
                MessageBox.Show( "Por favor informe o nome do cliente", "Informação", MessageBoxButtons.OK,
                                MessageBoxIcon.Information );
            }
            if (String.IsNullOrWhiteSpace(txtCodigo.Text))
            {
                MessageBox.Show("Por favor informe o codigo do cliente", "Informação", MessageBoxButtons.OK,
                                MessageBoxIcon.Information);
            }
            else
            {
                using ( frmCadastrarTelefone telefone = new frmCadastrarTelefone(Convert.ToInt32(txtCodigo.Text)) )
                {
                    telefone.ShowDialog();

                    this.ListTelefone = telefone.ListTelefones;
                    txtTelefone.Text = string.Format( "{0}{1}", ListTelefone[0].Ddd, ListTelefone[0].Numero );
                }
            }
        }

        private void frmCadastroDeCliente_Load( object sender, EventArgs e )
        {
            PrepareTelaParaNovoRegistro();
        }

        private void btnSalvar_Click( object sender, EventArgs e )
        {
            Salvar();
        }

        private void CarregueClientesJaCadastrados()
        {
            grdClientes.DataSource = FabricaGenerica.Crie<IServicoDeCliente>().ConsulteTodos();
        }

        private void btnNovo_Click( object sender, EventArgs e )
        {
            PrepareTelaParaNovoRegistro();
        }

        private void btnExcluir_Click( object sender, EventArgs e )
        {
            if ( !EmEdicao() )
            {
                this.ExibaInconsistencia( "Cliente não selecionada para edição." );
            }
            else
            {
                var servicoDeOperador = FabricaGenerica.Crie<IServicoDeOperador>();
                servicoDeOperador.Exclua( int.Parse( txtCodigo.Text ) );

                PrepareTelaParaNovoRegistro();
            }
        }

        #endregion

        #region Form Functions

        private void Salvar()
        {
            int codigo;
            int.TryParse( txtCodigo.Text, out codigo );
            var cliente = new DtoCliente
                              {
                                  Codigo = codigo,
                                  Nome = txtNome.Text,
                                  Cnh = txtCnh.Text,
                                  Cpf = txtCpf.Text,
                                  TipoDoCliente = cmbTipoCliente.SelectedIndex,
                                  Dependentes =  null,
                                  Enderecos =  null,
                                  Telefones =  null
                              };

            var servicoDeCliente = FabricaGenerica.Crie<IServicoDeCliente>();

            if ( !EmEdicao() )
                servicoDeCliente.Cadastre( cliente, ListDependente,ListTelefone,ListEndereco );
            else
                servicoDeCliente.Atualize( cliente );

            PrepareTelaParaNovoRegistro();
        }

        private bool EmEdicao()
        {
            return !string.IsNullOrWhiteSpace( txtCodigo.Text ) && txtCodigo.Enabled == false;
        }

        private void PrepareTelaParaNovoRegistro()
        {
            LimpeCamposEdicao();
            CarregueClientesJaCadastrados();
            txtCodigo.Enabled = true;
            txtCodigo.Focus();
        }

        private void LimpeCamposEdicao()
        {
            txtCodigo.Text = string.Empty;
            txtNome.Text = string.Empty;
            txtCnh.Text = string.Empty;
            txtCpf.Text = string.Empty;
            txtTelefone.Text = string.Empty;
            txtEndereco.Text = string.Empty;
            cmbTipoCliente.SelectedIndex = 0;
        }

        #endregion
        
        private void btnAddEndereco_Click( object sender, EventArgs e )
        {
            if ( String.IsNullOrWhiteSpace( txtNome.Text ) )
            {
                MessageBox.Show( "Por favor informe o nome do cliente", "Informação", MessageBoxButtons.OK,
                                MessageBoxIcon.Information );
            }
            else
            {
                using ( frmCadastroDeEndereco endereco = new frmCadastroDeEndereco() )
                {
                    endereco.ShowDialog();

                    this.ListEndereco = endereco.ListEndereco;
                }
            }
        }

        private void btnAddDependente_Click( object sender, EventArgs e )
        {
            if ( String.IsNullOrWhiteSpace( txtNome.Text ) )
            {
                MessageBox.Show( "Por favor informe o nome do cliente", "Informação", MessageBoxButtons.OK,
                                MessageBoxIcon.Information );
            }
            else
            {
                using ( frmCadastroDeDependente dependete = new frmCadastroDeDependente( txtNome.Text ) )
                {
                    dependete.ShowDialog();

                    this.ListDependente = dependete.ListDependente;
                }
            }
        }

    }
}
